/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#include "manager.h"

GwManager::GwManager() = default;

// 初始化
bool GwManager::Init(const string &config_path) {
	cout << "------------- initialize -------------" << endl;
	// 加载配置
	Config cfg;
	if (!cfg.Load(config_path)) {
		Logger::error("Failed to load config file.");
		return false;
	}
	cfg.agentIP   = "0.0.0.0";
	cfg.agentPort = 8080;

	// 初始化日志
	Logger::Level   = "info";
	Logger::LogFile = "./logs/app.log";

	// 创建上下文(reset:释放旧内存，分配新内存)
	context.reset(new Context(cfg));

	// 创建模块
	cout << endl << "------------ construction ------------" << endl;
	auto mod_gateway = unique_ptr<GatewayModule>(new GatewayModule(*context, MODULE_GATEWAY));
	auto mod_agent   = unique_ptr<AgentModule>(new AgentModule(*context, MODULE_AGENT));
	auto mod_sync    = unique_ptr<SyncModule>(new SyncModule(*context, MODULE_SYNC));
	auto mod_router  = unique_ptr<RouterModule>(new RouterModule(*context, MODULE_ROUTER));


	// 注册模块(注意⚠️：模块的注册顺序决定了初始化和启动的顺序)
	cout << endl << "-------------- register --------------" << endl;
	return this->_register(move(mod_gateway)) && // 注册网关模块
	       this->_register(move(mod_sync)) &&    // 注册同步模块
	       this->_register(move(mod_router)) &&  // 注册路由模块
	       this->_register(move(mod_agent));     // 注册代理模块
}

void GwManager::Launch() const {
	cout << "--------------- launch ---------------" << endl;
	for (auto &module: module_vec) {
		module->Start();
	}
}

// 注册模块
bool GwManager::_register(unique_ptr<Module> module) {
	// 检查模块是否已注册
	if (module_map.find(module->ModuleName()) != module_map.end()) {
		Logger::error("Module " + module->ModuleName() + " already Registered.");
		return false;
	}

	// 初始化模块
	if (!module->Init()) {
		Logger::error("Failed to initialize module " + module->ModuleName());
		return false;
	}

	// 向上下文注册模块
	context->Reg(module->ModuleName(), module.get());
	Logger::info("🤝 " + module->ModuleName() + " registered ...\n");

	// 添加模块到模块向量
	module_map[module->ModuleName()] = module_vec.size(); // 新模块的索引
	module_vec.push_back(move(module));                   // 移动模块所有权
	return true;
}

// 注销模块
void GwManager::_unregister(const string &module_name) {
	// 检查模块是否已注册
	const auto it = module_map.find(module_name);
	if (it == module_map.end()) {
		Logger::error("Module " + module_name + " not Registered.");
		return;
	}

	// 停止模块（将it->second显式转换为容器的difference_type)
	const auto index = static_cast<decltype(module_vec)::difference_type>(it->second);
	module_vec[index]->Stop();

	// 移除模块
	module_vec.erase(module_vec.begin() + index); // 移除模块
	module_map.erase(it);                         // 移除映射

	// 调整其他模块的索引
	for (auto &pair: module_map) {
		if (pair.second > index) {
			pair.second--;
		}
	}
	Logger::info("⏬ " + module_name + " unregistered ...\n");
}

GwManager::~GwManager() {
	cout << "------------- unregister -------------" << endl;
	// 跟注册相反, 先停止, 再注销
	this->_unregister(MODULE_AGENT);
	this->_unregister(MODULE_ROUTER);
	this->_unregister(MODULE_SYNC);
	this->_unregister(MODULE_GATEWAY);

	cout << "-------------- cleanup ---------------" << endl;
	module_vec.clear();
	Logger::error("♻️  Cleanup module_vec done.");
	module_map.clear();
	Logger::error("♻️  Cleanup module_map done.");

	context.reset(); // 释放内存, 防止内存泄漏
	// Logger::error("cleanup context done."); // 会报错, 因为_context已经被释放了

	cout << endl << "------------ 👋 bye bye ! ------------" << endl << endl;
}
